package com.jt.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Random;


/**
 * 定义服务消费端Controller,在这个Controller对象
 * 的方法中实现对远端服务sca-provider的调用
 */
@RestController
public class ConsumerController {

    /**
     * 注入LoadBalancerClient对象
     * 借助此对象，可以基于服务名从nacos获取多个服务实例，并且基于一定的负载均衡算法进行远端服务调用
     * */
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    /**
     * 从spring容器获取一个RestTemplate对象,
     * 基于此对象实现远端服务调用
     */
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 获取端口值或端口号
     * 先获取端口值：sca-consumer
     * 获取不到端口值的情况下获取默认端口号8090
     * */
    @Value("${spring.application.name:8090}")
    private String appName;

    @Autowired
    private RestTemplate loadBalancedRestTemplate;

    /**
     * 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
     * @return
     * 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
     */
    @GetMapping("/consumer/doRestEcho1")
    public String doRestEcho01(){
        //1.定义要调用的远端服务的url
        String url="http://localhost:8081/provider/echo/sca-consummer";
        //2.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

    //访问此方法的url: http://localhost:8090/consumer/doRestEcho2
    @GetMapping("/consumer/doRestEcho2")
    public String doRestEcho02(){
        //1.基于服务名获取服务实例
        ServiceInstance ServiceInstance = loadBalancerClient.choose("sca-provider");
        //2.基于服务实例构建要访问服务的url
        String ip = ServiceInstance.getHost();
        int port = ServiceInstance.getPort();
        //String url="http://" +ip+ ":" +port+ "/provider/echo/8090";
        //为了避免拼接字符串，我们可以使用占位符代替
        String url = String.format("http://%s:%s/provider/echo/%s", ip,port,appName);

        //3.基于restTemplate对象中的相关方法进行服务调用
        return restTemplate.getForObject(url, String.class);
    }

    //自定义restTemplate方法
    @GetMapping("/consumer/doRestEcho3")
    public String doRestEcho3(){
        String url=String.format("http://%s/provider/echo/%s","sca-provider",appName);
        //向服务提供方发起http请求,获取响应数据
        return loadBalancedRestTemplate.getForObject(
                url,//要请求的服务的地址
                String.class);//String.class为请求服务的响应结果类型
    }




}